package controladores;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import javax.swing.JOptionPane;

import logica.Categoria;
import logica.Juego;
import persistencia.PersistirComentario;
import persistencia.PersistirJuego;
import datas.DataJuego;
import datas.DataNick;
import datas.DataNombre;

public class ControladorJuego {
	

	public ControladorJuego() {}

	
/********************************************************************************************************/
/*********************************************************************************************************/
	/*------------------------ COMPRAR JUEGO Y LISTAR COMENTARIO-------------------*/
	
	public Set<DataJuego> listarJuegos(){
		Set<DataJuego> juegos = new TreeSet<DataJuego>();
		try {
			PersistirJuego pj = new PersistirJuego();
			ResultSet rs = pj.getDatosDeCompra();
			while(rs.next()){
				DataJuego nuevo = new DataJuego();
				nuevo.setId(rs.getInt("Id"));
				nuevo.setNombre(rs.getString("Nombre"));
				nuevo.setDescripcion(rs.getString("Descripcion"));
				nuevo.setPrecio(rs.getFloat("Precio"));
				juegos.add(nuevo);
			}
			rs.close();
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN listarJuegos");
		}
		return juegos;
	}
	
	
/**********************************************************************************************************/
/*********************************************************************************************************/
	/*------------------------  CONSULTAR JUEGO  --------------------------*/
	
	//DEVULEVE COMO RESULTADO EL NOMBRE DE TODOS LOS JUEGOS DE CATEGORIA
	public Set<DataNombre> getJuegosDeCategoria(String categoria){
		Set<DataNombre> juegos = new TreeSet<DataNombre>();
		try {
			PersistirJuego pj = new PersistirJuego();
			ResultSet rs = pj.getJuegosDeCategoria(categoria);
			while(rs.next()){
				DataNombre nuevo = new DataNombre();
				nuevo.setNombre(rs.getString("Nombre"));
				juegos.add(nuevo);
			}
			rs.close();
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getJuegosDeCategoria");
		}
		return juegos;
	}
	
	
	//DEVUELVE EL JUEGO DE NOMBRE CON TODA SU INFORMACON
	public Juego getInformacionJuego(DataNombre nombre){
		Juego juego = null;
		try {
			PersistirJuego pj = new PersistirJuego();
			ResultSet rs = pj.getInfoJuego(nombre.getNombre());
		/***************************************************************/	
			int id = rs.getInt("Id");
			String descripcion = rs.getString("Descripcion");
			int tamanio = rs.getInt("Tamanio");
			float precio = rs.getFloat("Precio");
			rs.close();
		/***************************************************************/	
			rs = pj.getDesarrollador(id);
			String desarrollador = rs.getString("Nick");
			rs.close();
		/***************************************************************/	
			Set<Categoria> categorias = new LinkedHashSet<Categoria>();
			rs = pj.getCategorias(id);
			while(rs.next()){
				Categoria cat = new Categoria(rs.getString("Nombre_Categoria"));
				categorias.add(cat);
			}
			rs.close();
		/***************************************************************/	
			juego = new Juego(id, nombre.getNombre(), descripcion, tamanio, precio, desarrollador, categorias);
		/***************************************************************/	
			rs = pj.getClientes(juego.getId());
			while(rs.next()){
				DataNick dc = new DataNick(rs.getString("Nick"));
				juego.getClientes().add(dc);
			}
			rs.close();
		/***************************************************************/	
			juego.setComentarios(cargarComentarios(id));
		/***************************************************************/
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getInfoJuego");
		}
		return juego;
	}
	
	
	//DEVUELVE UN MAP DE TODOS LOS COMENTARIOS DEL JUEGO CON ID
	@SuppressWarnings("rawtypes")
	private Map<String, Map> cargarComentarios(int id){
		Map<String, Map> comentarios = new LinkedHashMap<String, Map>();
		try {
			PersistirComentario PC = new PersistirComentario();
			ResultSet rs = PC.getComentariosPropios(id);
			while(rs.next()){
				comentarios.put(rs.getDate("Fecha")+" - "
								+rs.getString("Nick")+": "
								+rs.getString("Texto").toLowerCase(), cargarSubComentarios(rs.getInt("Id")));
			}
			rs.close();
		} 
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN cargarComentario");
		}
		return comentarios;
	}
	
	
	//DEVULVE UN MAP CON TODOS LOS COMENTARIO Y SUB-COMENTARIOS DE UN COMENTARIO DE ID
	@SuppressWarnings({ "rawtypes" })
	private Map<String, Map> cargarSubComentarios(int id){
		Map<String, Map> comentarios = new LinkedHashMap<String, Map>();
		try {
			PersistirComentario PC = new PersistirComentario();
			ResultSet rs = PC.getComentariosDe(id);
			while(rs.next()){
				Map<String, Map> sub = cargarSubComentarios(rs.getInt("Id"));
				comentarios.put(rs.getDate("Fecha")+" - "+rs.getString("Nick")+": "+rs.getString("Texto").toLowerCase(), sub);
			}
			rs.close();
		} 
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN cargraSubComentario");
		}
		return comentarios;
	}
	

/**********************************************************************************************************/
/*********************************************************************************************************/
	/*------------------------  ALTA DE JUEGO  ----- TODO OK---------------------*/
	
	//DEVUELVE TRUE SII EL JUEGO EXISTE, FALSE EN OTRO CASO
	public boolean existeJuego(String nombre){
		PersistirJuego PJ = new PersistirJuego();
		return PJ.existeJuego(nombre);
	}
	
	//DA DE ALTA UN JUEGO Y STRING EN MAYUSCULA
	public Juego altaJuego(String nombre, int tamanio, float precio, String descripcion, Set<Categoria> categorias, String desarrollador){
		Juego nuevo = new Juego(0, nombre.toUpperCase(), descripcion.toUpperCase(), tamanio, precio, desarrollador.toUpperCase(), categorias);
		return new PersistirJuego().addJuego(nuevo);
	}
	
}
